package com.gdust.hzx.manager.utils;

import com.gdust.hzx.model.entity.system.SysMenu;

import java.util.ArrayList;
import java.util.List;

/**
 * ClassName: MenuHelper
 * Package: com.gdust.spzx.manager.utils
 * Description:封装树形菜单数据，递归构建树形结构菜单工具类
 *
 * @Author syun
 * @Create 2024/11/24 15:45
 * @Version 1.0
 */
public class MenuHelper {

    /**
     * 递归实现树形菜单的构建
     *
     * 功能说明：
     * - 遍历所有菜单，找到顶级菜单（`parentId` 为 0 的菜单）。
     * - 通过递归的方式，为每个顶级菜单查找其子菜单，构建树形结构。
     *
     * @param sysMenuList 所有菜单的集合
     * @return 树形结构的菜单列表
     */
    public static List<SysMenu> buildTree(List<SysMenu> sysMenuList) {
        //sysMenuList所有菜单集合，用于存储树形结构的顶级菜单
        //创建list集合，用于封装最终数据
        ArrayList<SysMenu> trees = new ArrayList<>();

        //遍历所有菜单集合，查找顶级菜单
        for(SysMenu sysMenu:sysMenuList){
            //找到递归操作入口，第一层的菜单（`parentId` 为 0 表示顶级菜单）
            if(sysMenu.getParentId().longValue() ==0){
                // 查找当前菜单的子菜单，并将其添加到树形菜单集合中
                //根据第一层，找下层数据，使用递归完成
                //写方法实现找下层过程：
                //方法里面传递两个参数：第一个参数为当前第一层菜单，第二个参数为所有菜单集合
                trees.add(findChildren(sysMenu,sysMenuList));
            }
        }
        // 返回树形菜单集合
        return trees;
    }

    /**
     * 递归查找子菜单
     *
     * 功能说明：
     * - 根据父菜单的 `id` 值，在所有菜单集合中查找对应的子菜单。
     * - 为找到的每个子菜单继续递归查找其子菜单，最终构建完整的树形结构。
     *
     * @param sysMenu 当前菜单节点
     * @param sysMenuList 所有菜单的集合
     * @return 包含子菜单的当前菜单节点
     */
    public static SysMenu findChildren(SysMenu sysMenu,List<SysMenu> sysMenuList){
        //SysMenu有属性 private List<SysMenu> children; 封装下一层数据
        sysMenu.setChildren(new ArrayList<>());// 初始化当前菜单的子菜单集合

        //递归查询 遍历所有菜单，查找当前菜单的直接子菜单
        //sysMenu的id值和sysMenuList中prentId(父节点id)相同
        for(SysMenu it:sysMenuList){

            //判断id和prentId是否相同---判断当前菜单的 `id` 是否与某菜单的 `parentId` 相同
            if(sysMenu.getId().longValue() == it.getParentId().longValue()){
                //it就是下层数据，进行封装
                // 如果是当前菜单的子菜单，则递归查找它的子菜单并添加到当前菜单的子菜单集合中
                sysMenu.getChildren().add(findChildren(it,sysMenuList));
            }
        }
        // 返回当前菜单节点（已包含所有子菜单）
        return sysMenu;
    }


}
